home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1996 February
/
EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso
/
earcd
/
util1
/
vmmstat.lha
/
VMMStat
/
RCS
/
main.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-07-25
|
25KB
|
1,047 lines
head 1.3;
access;
symbols;
locks; strict;
comment @ * @;
1.3
date 95.07.25.18.02.31; author enderle; state Exp;
branches;
next 1.2;
1.2
date 95.07.25.12.49.51; author enderle; state Exp;
branches;
next 1.1;
1.1
date 95.07.25.11.29.56; author enderle; state Exp;
branches;
next ;
desc
@VMMStat displays the statistics of VMM
@
1.3
log
@Added workbench startup stuff and improved the
error outputting function (CleanUp()).
@
text
@/*
*
* $VER: main 1.1 (25.07.95) $
* $Id: main.c 1.2 1995/07/25 12:49:51 enderle Exp enderle $
*
* $RCSfile: main.c $
* $Revision: 1.2 $
* $Author: enderle $
*
* (C) Copyright 1995 by Frank Enderle
* All Rights Reserved
*
* $Log: main.c $
* Revision 1.2 1995/07/25 12:49:51 enderle
* Several minor changes had been made. Extensive comments added.
* Also some minor bugs have been removed.
*
* Revision 1.1 1995/07/25 11:29:56 enderle
* Initial revision
*
*
*/
/***** SYSTEM INCLUDES *********************************************/
#include <stdio.h>
#include <string.h>
#include <exec/memory.h>
#include <libraries/locale.h>
#include <devices/timer.h>
#include <clib/dos_protos.h>
#include <clib/exec_protos.h>
#include <clib/locale_protos.h>
#ifdef __MAXON__
#include <pragmas/dos_lib.h>
#include <pragmas/exec_lib.h>
#include <pragmas/locale_lib.h>
#include <wbstartup.h>
#endif
/***** OTHER INCLUDES **********************************************/
#include "VMM_Stat.h" /* standard include of VMM */
#include "interface.h" /* interface definitions */
#include "VMMStatStrings_cat.h" /* locale definitions */
/***** DEFINES *****************************************************/
#define TIMER_SECS 2 /* delay time seconds part */
#define TIMER_MICS 0 /* delay time micros part */
/***** PRIVATE STRUCTURES ******************************************/
struct Data {
struct MsgPort *timerMP; /* timer message port */
struct timerequest *timerIO; /* timerrequest */
ULONG deviceOpen; /* TRUE if opened */
struct VMStatMsg *vmStatMsg; /* message from vmm */
ULONG vmSignal; /* vmm signal bit */
};
/***** GLOBAL VARIBALES ********************************************/
struct Library *LocaleBase = NULL; /* base of locale lib */
struct Library *MUIMasterBase = NULL; /* base of mui lib */
struct Library *IntuitionBase = NULL; /* base of intuition */
struct Catalog *catalog = NULL; /* base of catalog */
struct ObjApp *app = NULL; /* base of application */
static char *verId = "$VER: VMMStat 1.1 (25.07.95) $";
/***** EXTERNALS ***************************************************/
extern struct Library *SysBase;
/***** PROTOTYPES **************************************************/
BOOL RequestStats( struct Data * );
void SetupInfo( struct ObjApp *, struct VMStatMsg * );
char *GetString( long );
void TriggerTimer( struct Data *, ULONG, ULONG );
struct Data *OpenAll( void );
void CleanUp( struct Data *, char * );
int main( );
/***** SUBROUTINES *************************************************/
/************************************************************
**
** NAME
** RequestStats - request VMM statistics
**
** SYNOPSIS
** BOOL RequestStats( struct Data *data );
**
** FUNCTION
** Sends an statistic request to VMM.
**
** INPUTS
** struct Data *data:
** Pointer to the VMMStat's data structure as returned
** by OpenAll()
**
** RESULTS
** TRUE
** if all is done.
**
** FALSE
** if VMM is not installed.
**
** BUGS
** Modifies data->vmStatMsg.
**
***********************************************************/
BOOL RequestStats( struct Data *data ) {
struct MsgPort *vmPort; /* vmm message port */
/* fill the VMStatMsg structure */
data->vmStatMsg->VMMessage.mn_Length = sizeof( struct VMStatMsg );
data->vmStatMsg->Sender = FindTask( NULL );
data->vmStatMsg->Command = VMCMD_AskStat;
data->vmStatMsg->ReplySignal = data->vmSignal;
/* forbid task switching to prevent from changing */
/* the port lists */
Forbid( );
/* search for vmm port */
if( vmPort = FindPort( "VMM_Port" ) ) {
/* signal vmm by putting a message */
PutMsg( vmPort, (struct Message *)data->vmStatMsg );
/* allow task switching */
Permit( );
/* return TRUE to indicate the success */
return( TRUE );
} else {
/* allow task switching */
Permit( );
/* return FALSE if VMM isn't installed */
return( FALSE );
}
}
/************************************************************
**
** NAME
** SetupInfo - setup information fields
**
** SYNOPSIS
** void SetupInfo( struct ObjApp *app,
** struct VMStatMsg *vmStatMsg );
**
** FUNCTION
** Fill the information text field of the window. Only
** update the contents of a field if they have changed.
** This avoids flickering.
**
** INPUTS
** struct ObjApp *app:
** Pointer to the application GUI structure as returned
** by CreateApp(). (Used in function OpenAll())
**
** struct VMStatMsg *vmStatMsg:
** Pointer to a filled VMStatMsg structure.
**
** RESULTS
** None.
**
** BUGS
** May be a bit slowly.
**
***********************************************************/
void SetupInfo( struct ObjApp *app, struct VMStatMsg *vmStatMsg ) {
char buffer[20]; /* local string buffer */
char *string; /* pointer to a string */
/* generate string for 'Free VirtualMem' text field */
sprintf( buffer, "%ld Bytes", vmStatMsg->VMFree );
/* change the field if the contents had changed */
get( app->TX_MAIN_INFO_FREEVIRT, MUIA_Text_Contents, &string );
if( strcmp( buffer, string) ) {
set( app->TX_MAIN_INFO_FREEVIRT, MUIA_Text_Contents, buffer );
}
/* generate string for 'Free FastMem' text field */
sprintf( buffer, "%ld Bytes", AvailMem( MEMF_FAST|MEMF_PUBLIC ) );
/* change the field if the contents had changed */
get( app->TX_MAIN_INFO_FREEFAST, MUIA_Text_Contents, &string );
if( strcmp( buffer, string) ) {
set( app->TX_MAIN_INFO_FREEFAST, MUIA_Text_Contents, buffer );
}
/* generate string for 'Page Faults' text field */
sprintf( buffer, "%ld", vmStatMsg->Faults );
/* change the field if the contents had changed */
get( app->TX_MAIN_INFO_FAULTS, MUIA_Text_Contents, &string );
if( strcmp( buffer, string) ) {
set( app->TX_MAIN_INFO_FAULTS, MUIA_Text_Contents, buffer );
}
/* generate string for 'Written Pages' text field */
sprintf( buffer, "%ld", vmStatMsg->PagesWritten );
/* change the field if the contents had changed */
get( app->TX_MAIN_INFO_PAGESWRITTEN, MUIA_Text_Contents, &string );
if( strcmp( buffer, string) ) {
set( app->TX_MAIN_INFO_PAGESWRITTEN, MUIA_Text_Contents, buffer );
}
/* generate string for 'Read Pages' text field */
sprintf( buffer, "%ld", vmStatMsg->PagesRead );
/* change the field if the contents had changed */
get( app->TX_MAIN_INFO_PAGESREAD, MUIA_Text_Contents, &string );
if( strcmp( buffer, string) ) {
set( app->TX_MAIN_INFO_PAGESREAD, MUIA_Text_Contents, buffer );
}
/* generate string for 'Number Of Frames' text field */
sprintf( buffer, "%ld", vmStatMsg->NumFrames );
/* change the field if the contents had changed */
get( app->TX_MAIN_INFO_NUMFRAMES, MUIA_Text_Contents, &string );
if( strcmp( buffer, string) ) {
set( app->TX_MAIN_INFO_NUMFRAMES, MUIA_Text_Contents, buffer );
}
/* generate string for 'Used Pages' text field */
sprintf( buffer, "%ld", vmStatMsg->PagesUsed );
/* change the field if the contents had changed */
get( app->TX_MAIN_INFO_PAGESUSED, MUIA_Text_Contents, &string );
if( strcmp( buffer, string) ) {
set( app->TX_MAIN_INFO_PAGESUSED, MUIA_Text_Contents, buffer );
}
/* generate string for 'Page Size' text field */
sprintf( buffer, "%ld KByte", (vmStatMsg->PageSize)/1024 );
/* change the field if the contents had changed */
get( app->TX_MAIN_INFO_PAGESIZE, MUIA_Text_Contents, &string );
if( strcmp( buffer, string) ) {
set( app->TX_MAIN_INFO_PAGESIZE, MUIA_Text_Contents, buffer );
}
/* generate string for 'Free TrapStructs' text field */
sprintf( buffer, "%ld", vmStatMsg->TrapStructsFree );
/* change the field if the contents had changed */
get( app->TX_MAIN_INFO_TRAPSTRUCTSFREE, MUIA_Text_Contents, &string );
if( strcmp( buffer, string) ) {
set( app->TX_MAIN_INFO_TRAPSTRUCTSFREE, MUIA_Text_Contents, buffer );
}
}
/************************************************************
**
** NAME
** GetString - get localized string
**
** SYNOPSIS
** char *GetString( long id )
**
** FUNCTION
** This function searches the given string id and returns
** the string either from the built in catalog (if no
** localization is available) or from the locale library.
**
** INPUTS
** long id:
** string id as defined in VMMStat_Strings.h
**
** RESULTS
** A pointer to the (localized) string.
**
** BUGS
** none known.
**
***********************************************************/
char *GetString( long id ) {
register long *ccat = (long *)&CatCompArray; /* built in strings */
if( LocaleBase && catalog ) {
/* get localized string from library and return it */
return( (char *)GetCatalogStr( catalog, id, (STRPTR)*(++ccat) ) );
} else {
/* search for string in array */
while( id != *ccat ) {
ccat += 2;
}
/* return built in string */
return( (char *)*(++ccat) );
}
}
/************************************************************
**
** NAME
** TriggerTimer - trigger the timer.device
**
** SYNOPSIS
** void TriggerTimer( struct Data *data,
** ULONG secs,
** ULONG mics );
**
** FUNCTION
** Perform a timerequest on the timer.device. After
** the request has been completed the VMMStat task will
** be signaled by the timer.device. This request is
** asynchronous.
**
** INPUTS
** struct Data *data:
** Pointer to a Data structure as returned by OpenAll().
**
** ULONG secs:
** Number of seconds to delay.
**
** ULONG mics:
** Number of micro seconds to delay.
**
** RESULTS
** None.
**
** BUGS
** None.
**
***********************************************************/
void TriggerTimer( struct Data *data, ULONG secs, ULONG mics ) {
/* fill the timerequest */
data->timerIO->tr_node.io_Command = TR_ADDREQUEST;
data->timerIO->tr_time.tv_secs = secs;
data->timerIO->tr_time.tv_micro = mics;
/* and request it */
SendIO( (struct IORequest *)data->timerIO );
}
/************************************************************
**
** NAME
** OpenAll - open required resources
**
** SYNOPSIS
** struct Data *OpenAll( void );
**
** FUNCTION
** This subroutine opens all required resources and
** allocates/fills the data-structure required in the
** whole program. If something goes wrong a direct
** call to CleanUp() is performed. In that case OpenAll()
** will not return to the caller function.
**
** INPUTS
** None.
**
** RESULTS
** Pointer to a Data structure.
**
** BUGS
** None.
**
***********************************************************/
struct Data *OpenAll( void ) {
struct Data *data; /* internal data structure */
static struct TagItem localeTags[] = { OC_Version, 1, TAG_DONE }; /* tags for locale lib */
/* check for OS 2 */
if( SysBase->lib_Version < 37 ) {
CleanUp( NULL, GetString( MSG_MAIN_NOT_OS2 ) );
}
/* open locale library and catalog file if available */
if( LocaleBase = OpenLibrary( "locale.library", 37 ) ) {
catalog = OpenCatalogA( NULL, (STRPTR)"vmmstat.catalog", localeTags );
}
/* allocate buffer for internal data structures */
if( data = AllocVec( sizeof( struct Data ), MEMF_PUBLIC|MEMF_CLEAR ) ) {
/* open intuition.library version 37 or higher */
if( !(IntuitionBase = OpenLibrary( "intuition.library", 37 )) ) {
CleanUp( data, GetString( MSG_MAIN_NO_INTUITION ) );
}
/* open muimaster.library version 8 or higher */
if( !(MUIMasterBase = OpenLibrary( "muimaster.library", 8 )) ) {
CleanUp( data, GetString( MSG_MAIN_NO_MUIMASTER ) );
}
/* create the application */
if( !(app = CreateApp( )) ) {
CleanUp( data, GetString( MSG_MAIN_NO_APP ) );
}
/* create message port for communication with the timer.device */
if( !(data->timerMP = CreateMsgPort( )) ) {
CleanUp( data, GetString( MSG_MAIN_NO_PORT ) );
}
/* create io structure for use with the timer.device */
if( !(data->timerIO = (struct timerequest *)CreateExtIO( data->timerMP, sizeof( timerequest ) )) ) {
CleanUp( data, GetString( MSG_MAIN_NO_MEM ) );
}
/* open the timer.device */
if( !(data->deviceOpen = !OpenDevice( "timer.device", UNIT_MICROHZ, (struct IORequest *)data->timerIO, 0 )) ) {
CleanUp( data, GetString( MSG_MAIN_NO_TIMER ) );
}
/* allocate buffer for the VMStatMsg structure */
if( !(data->vmStatMsg = AllocVec( sizeof( struct VMStatMsg ), MEMF_PUBLIC|MEMF_CLEAR )) ) {
CleanUp( data, GetString( MSG_MAIN_NO_MEM ) );
}
/* get a signal for VMM */
if( (data->vmSignal = AllocSignal( -1L )) == -1L ) {
CleanUp( data, GetString( MSG_MAIN_NO_SIG ) );
}
/* return pointer */
return( data );
} else {
/* error: no memory */
CleanUp( NULL, GetString( MSG_MAIN_NO_MEM ) );
}
}
/************************************************************
**
** NAME
** CleanUp - free resources
**
** SYNOPSIS
** void CleanUp( struct Data *data,
** char *message );
**
** FUNCTION
** Free resources allocated by OpenAll() and output a
** given message (if there's any). This function never
** returns to the caller function.
**
** INPUTS
** struct Data *data:
** Pointer to a Data structure as returned by OpenAll().
**
** char *message:
** Pointer to a message which should be outputed. If
** this pointer is NULL nothing will be displayed.
** The message can be displayed in three ways:
**
** 1) on OS version < 37 a simple Write is performed
** to the console.
**
** 2) on OS versions >= 37 a requester will popup. If
** MUI is available it will be used.
**
** 3) on OS versions >= 37 a call from CLI will prompt
** messages to the console.
**
** RESULTS
** None.
**
** BUGS
** None.
**
***********************************************************/
void CleanUp( struct Data *data, char *message ) {
struct Task *myTask = FindTask( NULL );
struct EasyStruct easy = { sizeof( struct EasyStruct ),
NULL, NULL, NULL, NULL };
/* check for message */
if( message ) {
if( SysBase->lib_Version < 37 ) {
/* if we run under OS < 37 */
printf( "VMMStat: %s\n", message );
} else {
/* we run at least on OS 37 */
if( (myTask->tc_Node.ln_Type == NT_PROCESS) && (((struct Process *)myTask)->pr_CLI) ) {
/* if we are a process (from CLI) */
printf( "VMMStat: %s\n", message );
} else {
/* if we are a task (from Workbench) */
if( MUIMasterBase && app ) {
/* MUI is available and the application has been created */
MUI_Request( app->App, NULL, 0, GetString( MSG_MAIN_ERROR ), GetString( MSG_MAIN_OK ),
message, NULL );
} else {
/* no MUI available so use standard OS 37 EasyRequestArgs */
if( IntuitionBase ) {
/* if intuition is available */
easy.es_Title = (UBYTE *)GetString( MSG_MAIN_ERROR );
easy.es_TextFormat = (UBYTE *)message;
easy.es_GadgetFormat = (UBYTE *)GetString( MSG_MAIN_OK );
EasyRequestArgs( NULL, (struct EasyStruct *)&easy, NULL, NULL );
}
}
}
}
}
/* data structure allocation check */
if( data ) {
/* free the signal */
if( data->vmSignal ) {
FreeSignal( data->vmSignal );
}
/* free vmStatMsg memory block */
if( data->vmStatMsg ) {
FreeVec( data->vmStatMsg );
}
/* close timer.device */
if( data->deviceOpen ) {
/* empty message queue */
while( GetMsg( data->timerMP ) );
CloseDevice( (struct IORequest *)data->timerIO );
}
/* free timer.device io structure */
if( data->timerIO ) {
DeleteExtIO( (struct IORequest *)data->timerIO );
}
/* remove timer.device message port */
if( data->timerMP ) {
DeleteMsgPort( data->timerMP );
}
/* close locale library and catalog if they have been used */
if( LocaleBase ) {
if( catalog ) {
CloseCatalog( catalog );
}
CloseLibrary( LocaleBase );
}
/* dispose the application */
if( app ) {
DisposeApp( app );
}
/* close the muimaster.library */
if( MUIMasterBase ) {
CloseLibrary( MUIMasterBase );
}
/* close the intuition.library */
if( IntuitionBase ) {
CloseLibrary( IntuitionBase );
}
/* free the data structure */
FreeVec( data );
}
/* return to the OS */
exit( NULL );
}
/***** MAIN PROGRAM ************************************************/
int main( ) {
register struct Data *data; /* Data structure ptr */
register LONG signals; /* MUI signals */
register BOOL running = TRUE; /* running indicator */
/* allocate required resources */
data = OpenAll( );
/* request statistics and exit if VMM is not running */
if( RequestStats( data ) ) {
/* fill text fields */
SetupInfo( app, data->vmStatMsg );
/* open the window */
set( app->WI_MAIN, MUIA_Window_Open, TRUE );
/* trigger the timer */
TriggerTimer( data, TIMER_SECS, TIMER_MICS );
/* main loop */
while( running ) {
switch( (ULONG)DoMethod( app->App, MUIM_Application_Input, &signals ) ) {
case MUIV_Application_ReturnID_Quit:
/* application should quit */
/* abort pending timer io's */
AbortIO( (struct IORequest *)data->timerIO );
WaitIO( (struct IORequest *)data->timerIO );
/* terminate loop */
running = FALSE;
break;
case ID_BT_MAIN_ABOUT:
/* popup about requester */
MUI_Request( app->App, app->WI_MAIN, 0, GetString( MSG_MAIN_ABOUT ), GetString( MSG_MAIN_OK ),
GetString( MSG_MAIN_ABOUT_BODY ), NULL );
break;
}
/* signal processing */
if( signals && running ) {
if( Wait( signals|(1L << data->timerMP->mp_SigBit) ) & (1L << data->timerMP->mp_SigBit) ) {
/* empty message queue */
while( GetMsg( data->timerMP ) );
/* request new statistics */
if( !RequestStats( data ) ) {
/* if not available we quit */
running = FALSE;
} else {
/* wait for VMM's signal */
Wait( 1L << data->vmSignal );
/* fill text fields */
SetupInfo( app, data->vmStatMsg );
/* trigger the timer */
TriggerTimer( data, TIMER_SECS, TIMER_MICS );
}
}
}
}
} else {
/* VMM not found */
CleanUp( data, GetString( MSG_MAIN_NO_VMM ) );
}
/* a clean exit */
CleanUp( data, NULL );
}
@
1.2
log
@Several minor changes had been made. Extensive comments added.
Also some minor bugs have been removed.
@
text
@d3 2
a4 2
* $VER: main.c 1.0 (25.07.95) $
* $Id: main.c 1.1 1995/07/25 11:29:56 enderle Exp enderle $
d7 1
a7 1
* $Revision: 1.1 $
d14 4
d40 2
d69 1
d73 5
a77 1
static char *verId = "$VER: VMMStat 1.0 (25.07.95) $";
d419 6
d435 6
d535 3
d542 41
a582 1
printf( "VMMStat: %s\n", message );
d646 6
d749 5
@
1.1
log
@Initial revision
@
text
@d4 1
a4 1
* $Id:$
d6 3
a8 3
* $RCSfile$
* $Revision$
* $Author$
d10 1
a10 1
* (C) Copyright 1994 Private Developments
d13 4
a16 1
* $Log$
d44 5
d66 1
a66 1
static char *verId = { "$VER: VMMStat 1.0 (25.07.95) $" };
d70 2
a72 4
BOOL RequestStats( struct VMStatMsg * );
void SetupInfo( struct ObjApp *, struct VMStatMsg * );
struct Data *openAll( void );
void cleanUp( struct Data *, char * );
d74 2
d80 27
a106 5
/*
** Function: GetString
**
** Description: this get's a localized string
*/
d108 2
a109 2
char *GetString( long id ) {
register long *ccat = (long *)&CatCompArray; /* built in strings */
d111 1
a111 1
if( LocaleBase && catalog ) {
d113 4
a116 25
/* get localized string from library and return it */
return( (char *)GetCatalogStr( catalog, id, (STRPTR)*(++ccat) ) );
} else {
/* search for string in array */
while( id != *ccat ) {
ccat += 2;
}
/* return built in string */
return( (char *)*(++ccat) );
}
}
/*
** Function: RequestStats
**
** Description: requests statistics from VMM
*/
BOOL RequestStats( struct VMStatMsg *vmStatMsg ) {
struct MsgPort *vmPort; /* vmm message port */
d129 1
a129 1
PutMsg( vmPort, (struct Message *)vmStatMsg );
d150 29
a178 5
/*
** Function: SetupInfo
**
** Description: setup the various text fields of the window
*/
d184 1
a184 1
/* generate string for text field */
d195 1
a195 1
/* generate string for text field */
d206 1
a206 1
/* generate string for text field */
d217 1
a217 1
/* generate string for text field */
d228 1
a228 1
/* generate string for text field */
d239 1
a239 1
/* generate string for text field */
d250 1
a250 1
/* generate string for text field */
d261 1
a261 1
/* generate string for text field */
d272 1
a272 1
/* generate string for text field */
d284 125
a408 3
struct Data *openAll( void ) {
struct Data *data;
static struct TagItem localeTags[] = { OC_Version, 1, TAG_DONE };
d414 2
d417 3
d421 7
a427 1
cleanUp( data, GetString( MSG_MAIN_NO_MUIMASTER ) );
d430 2
d433 1
a433 1
cleanUp( data, GetString( MSG_MAIN_NO_PORT ) );
d436 2
d439 1
a439 1
cleanUp( data, GetString( MSG_MAIN_NO_MEM ) );
d442 2
d445 1
a445 1
cleanUp( data, GetString( MSG_MAIN_NO_TIMER ) );
d448 1
a448 3
if( !(app = CreateApp( )) ) {
cleanUp( data, GetString( MSG_MAIN_NO_APP ) );
}
d451 1
a451 1
cleanUp( data, GetString( MSG_MAIN_NO_MEM ) );
d454 2
d457 1
a457 1
cleanUp( data, GetString( MSG_MAIN_NO_SIG ) );
d460 2
d464 4
a467 1
cleanUp( NULL, GetString( MSG_MAIN_NO_MEM ) );
d471 44
a514 1
void cleanUp( struct Data *data, char *message ) {
d519 2
d522 3
d529 2
d535 1
a535 3
if( app ) {
DisposeApp( app );
}
d538 5
d546 2
d552 2
d558 2
d561 4
a564 1
CloseCatalog( catalog );
d568 8
d580 2
d584 3
d590 6
a595 4
void TriggerTimer( struct Data *data, ULONG secs, ULONG mics ) {
data->timerIO->tr_node.io_Command = TR_ADDREQUEST;
data->timerIO->tr_time.tv_secs = secs;
data->timerIO->tr_time.tv_micro = mics;
d597 1
a597 2
SendIO( (struct IORequest *)data->timerIO );
}
d599 1
a599 4
int main( ) {
register struct Data *data;
LONG signals;
BOOL running = TRUE;
d601 1
a601 1
data = openAll( );
d603 1
a603 4
data->vmStatMsg->VMMessage.mn_Length = sizeof( struct VMStatMsg );
data->vmStatMsg->Sender = FindTask( NULL );
data->vmStatMsg->Command = VMCMD_AskStat;
data->vmStatMsg->ReplySignal = data->vmSignal;
d605 1
a605 1
TriggerTimer( data, 2, 0 );
a606 1
if( RequestStats( data->vmStatMsg ) ) {
d609 2
d613 5
a617 1
SendIO( (struct IORequest *)data->timerIO );
d621 5
a626 1
case MUIV_Application_ReturnID_Quit:
d628 4
d636 3
d644 2
d648 11
a658 2
GetMsg( data->timerMP );
if( !RequestStats( data->vmStatMsg ) ) {
d661 3
d665 3
d670 3
a672 1
TriggerTimer( data, 2, 0 );
d679 3
a681 1
cleanUp( data, NULL );
@